package lol.clann.exampleplugin.task;

import lol.clann.bukkit.pluginboot.PluginBoot;
import lol.clann.bukkit.pluginboot.task.Task;
import lol.clann.clannboot.annotation.inject.PostInject;
import lol.clann.clannboot.annotation.svc.Service;
import lol.clann.clannboot.module.Module;
import lol.clann.clannboot.util.BaseUtils;
import lol.clann.exampleplugin.ExamplePlugin;
import org.bukkit.Server;
import org.bukkit.entity.Player;
import org.nutz.ioc.loader.annotation.Inject;
import org.slf4j.Logger;

import java.util.ArrayList;
import java.util.List;

/**
 * @author pyz
 * @date 2018/10/8 下午10:42
 */
// Service前面介绍过了,不再赘述
@Service
public class ExampleTask {
    // PluginBoot内置大量注入类型,还可以自己添加自定义注入类型
    @Inject
    private Server server;
    // 前面说过插件主类可直接注入,其他插件的主类也可以这样注入
    @Inject
    private ExamplePlugin examplePlugin;
    // 这个例子就是注入了PluginBoot插件的主类
    @Inject
    private PluginBoot pluginBoot;
    // 插件在ClannBoot中是以Module(模块)的形式存在
    // 这里是ExamplePlugin插件,所以注入的是ExamplePlugin的Module
    @Inject
    private Module module;
    // PluginBoot使用slf4j作为日志框架,插件主类的构造函数中传入的名字,在这里会用上
    @Inject
    private Logger logger;

    // PostInject在所有service注入完成后调用
    @PostInject
    private void init() {
        oldKick1();
    }

    // 不使用@Task的写法
    private void oldKick1() {
        Thread t = new Thread(() -> {
            while (true) {
                try {
                    List<Player> players = new ArrayList<>(server.getOnlinePlayers());
                    for (Player player : players) {
                        player.kickPlayer("休想进服");
                    }
                } catch (Throwable e) {
                    logger.error("", e);
                }
                // 休眠1000毫秒
                BaseUtils.dely(1000);
            }
        });
        t.start();
        // 把线程交给module管理,以便在插件卸载时自动停止线程
        module.add(() -> t.interrupt());
    }

    // 使用@Task的写法
    // 此方法会自动注册到任务管理器,不需要手动调用,会按照注解定义的方式自动执行,并且在插件卸载时停止任务
    // loop  true: 该方法会以给定的间隔时间循环执行
    //      false:方法返回,线程就结束了
    // async: false:会使用Bukkit调度器,调度到主线程执行
    @Task(async = false, dely = "1000", name = "休想进服", loop = true)
    private void newKick1() {
        List<Player> players = new ArrayList<>(server.getOnlinePlayers());
        for (Player player : players) {
            player.kickPlayer("休想进服");
        }
    }

}
